package org.qengine.controller;

import lombok.Data;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

/**
 * 全局异常处理器，用于捕获并处理由 {@link UserController} 中抛出的特定类型的异常。
 */
@ControllerAdvice(assignableTypes = UserController.class)
public class UserExceptionController extends ResponseEntityExceptionHandler {

    /**
     * 用户重复异常，当尝试添加已存在的用户时抛出。
     */
    public static class DuplicateUserException extends RuntimeException {
        public DuplicateUserException(String message) {
            super(message);
        }
    }

    /**
     * 实体未找到异常，当请求的数据实体不存在时抛出。
     */
    public static class EntityNotFoundException extends RuntimeException {
        public EntityNotFoundException(String message) {
            super(message);
        }
    }

    /**
     * 禁止访问异常，当用户尝试执行没有权限的操作时抛出。
     */
    public static class ForbiddenAccessException extends RuntimeException {
        public ForbiddenAccessException(String message) {
            super(message);
        }
    }

    /**
     * 无效角色异常，当用户提供的角色信息不符合系统规定时抛出。
     */
    public static class InvalidRoleException extends RuntimeException {
        public InvalidRoleException(String message) {
            super(message);
        }
    }

    /**
     * 错误响应对象，用于构建统一格式的错误消息返回给客户端。
     */
    @Data
    static class ErrorVo {
        private String status; // HTTP状态码描述
        private String message; // 错误详情信息

        public ErrorVo(String status, String message) {
            this.status = status;
            this.message = message;
        }
    }

    /**
     * 处理自定义的 EntityNotFoundException 异常，返回404 Not Found响应。
     *
     * @param ex    抛出的异常实例
     * @param request Web请求对象
     * @return 包含错误信息的HTTP响应
     */
    @ExceptionHandler(EntityNotFoundException.class)
    public ResponseEntity<ErrorVo> handleEntityNotFound(EntityNotFoundException ex, WebRequest request) {
        ErrorVo error = new ErrorVo("Not Found", ex.getMessage());
        return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
    }

    /**
     * 处理自定义的 ForbiddenAccessException 异常，返回403 Forbidden响应。
     *
     * @param ex    抛出的异常实例
     * @param request Web请求对象
     * @return 包含错误信息的HTTP响应
     */
    @ExceptionHandler(ForbiddenAccessException.class)
    public ResponseEntity<ErrorVo> handleForbiddenAccess(ForbiddenAccessException ex, WebRequest request) {
        ErrorVo error = new ErrorVo("Forbidden", ex.getMessage());
        return new ResponseEntity<>(error, HttpStatus.FORBIDDEN);
    }

    /**
     * 处理所有其他未经处理的异常，默认返回500 Internal Server Error响应。
     *
     * @param ex    抛出的异常实例
     * @param request Web请求对象
     * @return 包含错误信息的HTTP响应
     */
    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorVo> handleAllExceptions(Exception ex, WebRequest request) {
        ErrorVo error = new ErrorVo("Internal Server Error", "An unexpected error occurred: " + ex.getMessage());
        return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}